/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import pojo.Agendamento;
import pojo.Doutor;
import pojo.ServicoAgendamento;

/**
 *
 * @author Rodolfo
 */
@Stateless
public class DaoAgendamento implements DaoAgendamentoLocal {

    private SimpleDateFormat sdf;
    @PersistenceContext
    private EntityManager manager;
    private List<GeraHorario> horarios = new ArrayList<GeraHorario>();

    public DaoAgendamento() {
    }

    @Override
    public List<GeraHorario> getHorariosDisponiveis(Doutor doutor, Date data) {
        System.out.println("entrou no stateles com o doutor " + doutor + " na data de " + data);
        return horarios;
    }

    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")
    @Override
    public List<Agendamento> buscaTodosAgendamentos() {
        return this.manager.createNamedQuery("Agendamento.findAll").getResultList();
    }

    @Override
    public Agendamento salvar(Agendamento agendamento) throws Exception {    
        List<ServicoAgendamento> itensAnteriores = null;
        List<ServicoAgendamento> itensAExcluir = null;
        List<ServicoAgendamento> itensAtuais = agendamento.getServicoAgendamentoList();
        if (agendamento.getIdAgendamento() != null) {
            itensAnteriores = this.manager.createNamedQuery("ServicoAgendamento.findByIdAgendamento").setParameter("idAgendamento", agendamento).getResultList();
        }

        try {
            agendamento = this.manager.merge(agendamento);
            this.manager.flush();
        } catch (Exception e) {
              if (e.getMessage().contains("Code: 1062")) {
                throw new Exception("Existe um agendamento já efetuado com essas informações.");
            } else {
                throw new Exception("Erro desconhecido ao excluir.");
            }
        }
        
        try {
            if (itensAnteriores != null) {
                itensAExcluir = new ArrayList<ServicoAgendamento>(itensAnteriores);
                for (ServicoAgendamento servicoAnterior : itensAnteriores) {
                    for (ServicoAgendamento servicoAtual : itensAtuais) {
                        if (servicoAnterior.getCodServico().equals(servicoAtual.getCodServico())) {
                            System.out.println("é pra remover: " + servicoAtual.getCodServico().getDescricao());
                            itensAExcluir.remove(servicoAnterior);
                        }
                    }
                }

                for (ServicoAgendamento servicoAgendamento : itensAExcluir) {
                    System.out.println("vai ser removido " + servicoAgendamento.getCodServico().getDescricao());
                    servicoAgendamento = this.manager.find(ServicoAgendamento.class, servicoAgendamento.getIdServicoAgendamento());
                    this.manager.remove(servicoAgendamento);
                }
            }
        } catch (Exception e) {
            throw new Exception("Erro ao salvar o agendamento.");
        }

        this.manager.flush();
        System.out.println("salvar" + agendamento.getIdAgendamento());
        return agendamento;
    }

    @Override
    public void excluir(Agendamento agendamento) throws Exception {

        Agendamento a;
        a = this.manager.find(Agendamento.class, agendamento.getIdAgendamento());
        if (a == null) {
            throw new Exception("Nenhum registro com o id informado, tente buscar o registro novamente.");
        }
        try {
            this.manager.remove(a);
            this.manager.flush();
        } catch (Exception e) {
            System.out.println("erroooooooooooooooooooooooooooooooooo");
            if (e.getMessage().contains("Code: 1451")) {
                throw new Exception("Registro utilizado em outra tabela.");
            } else {
                throw new Exception("Erro desconhecido ao excluir.");
            }
        }
    }

    @Override
    public Agendamento selecionaAgendamentoId(Integer id) {
        Agendamento a = this.manager.find(Agendamento.class, id);
        System.out.println(id);
        for (ServicoAgendamento s : a.getServicoAgendamentoList()) {
            System.out.println(s.getCodServico().getDescricao());
        }
        List servicos = this.manager.createNamedQuery("ServicoAgendamento.findByIdAgendamento").setParameter("idAgendamento", a).getResultList();

        System.out.println("a reconsulta");
        for (Object object : servicos) {
            System.out.println(((ServicoAgendamento) object).getCodServico().getDescricao());
        }
        a.setServicoAgendamentoList(servicos);
        System.out.println("buscaaa" + a.getIdAgendamento());
        return a;
    }

    @Override
    public List<Agendamento> buscaAgendamentoParamentros(Date dataInicial, Date dataFinal, Doutor doutor) {
        boolean temParametro = false;
        String select = "SELECT a FROM Agendamento a";
        if ((dataFinal != null) || (dataInicial != null) || (doutor != null)){
            select = select + " WHERE";
        }
        if(dataInicial != null){
            select = select + " a.data >= :dataIni";
            temParametro = true;
        }
        if(dataFinal != null){
            if (temParametro)
                select = select + " and a.data <= :dataFin";
            else
                select = select + " a.data <= :dataFin";
            temParametro = true;
        }
        
        if(doutor != null){
            if (temParametro)
                select = select + " and a.codDoutor = :doutor";
            else
                select = select + " a.codDoutor = :doutor";
        }
        
        System.out.println("Esse é o select bicho véio" + select);
        
        Query q = this.manager.createQuery(select);
        if(dataInicial != null)
            q.setParameter("dataIni", dataInicial);
        if(dataFinal != null)
            q.setParameter("dataFin", dataFinal); 
         if(doutor != null)
            q.setParameter("doutor", doutor); 
        return q.getResultList();
    }
}
